--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNS/Interfaces/TCPInterface.py b051e76d00ab97baa948e69cdacadba3cf4739da (b051e76d) Text, 29.88 KB
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787Interface Tff7b72import Te6edf3Interface
Tff7b72import T7ee787socketserver
Tff7b72import T7ee787threading
Tff7b72import T7ee787platform
Tff7b72import T7ee787socket
Tff7b72import T7ee787time
Tff7b72import T7ee787sys
Tff7b72import T7ee787os
Tff7b72import T7ee787RNS
Tff7b72class T56d364TCPInterfaceTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3HW_MTU Tff7b72= T79c0ff262144
Tff7b72class T56d364HDLCTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3FLAG Tff7b72= T79c0ff0x7E
Te6edf3ESC Tff7b72= T79c0ff0x7D
Te6edf3ESC_MASK Tff7b72= T79c0ff0x20
Tf0883e@staticmethod
Tff7b72def Td2a8ffescapeTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffESCTff7b72^Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffFLAGTff7b72^Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3data
Tff7b72class T56d364KISSTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3FEND Tff7b72= T79c0ff0xC0
Te6edf3FESC Tff7b72= T79c0ff0xDB
Te6edf3TFEND Tff7b72= T79c0ff0xDC
Te6edf3TFESC Tff7b72= T79c0ff0xDD
Te6edf3CMD_DATA Tff7b72= T79c0ff0x00
Te6edf3CMD_UNKNOWN Tff7b72= T79c0ff0xFE
Tf0883e@staticmethod
Tff7b72def Td2a8ffescapeTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[T79c0ff0xdbTb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[T79c0ff0xdbTb4b4b4, T79c0ff0xddTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[T79c0ff0xc0Tb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[T79c0ff0xdbTb4b4b4, T79c0ff0xdcTb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3data
Tff7b72class T56d364ThreadingTCPServerTb4b4b4(Te6edf3socketserverTff7b72.Td2a8ffThreadingMixInTb4b4b4, Te6edf3socketserverTff7b72.Td2a8ffTCPServerTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72class T56d364ThreadingTCP6ServerTb4b4b4(Te6edf3socketserverTff7b72.Td2a8ffThreadingMixInTb4b4b4, Te6edf3socketserverTff7b72.Td2a8ffTCPServerTb4b4b4)Tb4b4b4:
Te6edf3address_family Tff7b72= Te6edf3socketTff7b72.Td2a8ffAF_INET6
Tff7b72class T56d364TCPClientInterfaceTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:
Te6edf3BITRATE_GUESS Tff7b72= T79c0ff10Tff7b72*T79c0ff1000Tff7b72*T79c0ff1000
Te6edf3DEFAULT_IFAC_SIZE Tff7b72= T79c0ff16
Te6edf3AUTOCONFIGURE_MTU Tff7b72= Tff7b72True
Te6edf3RECONNECT_WAIT Tff7b72= T79c0ff5
Te6edf3RECONNECT_MAX_TRIES Tff7b72= Tff7b72None
T8b949e# TCP socket options
Te6edf3TCP_USER_TIMEOUT Tff7b72= T79c0ff24
Te6edf3TCP_PROBE_AFTER Tff7b72= T79c0ff5
Te6edf3TCP_PROBE_INTERVAL Tff7b72= T79c0ff2
Te6edf3TCP_PROBES Tff7b72= T79c0ff12
Te6edf3INITIAL_CONNECT_TIMEOUT Tff7b72= T79c0ff5
Te6edf3SYNCHRONOUS_START Tff7b72= Tff7b72True
Te6edf3I2P_USER_TIMEOUT Tff7b72= T79c0ff45
Te6edf3I2P_PROBE_AFTER Tff7b72= T79c0ff10
Te6edf3I2P_PROBE_INTERVAL Tff7b72= T79c0ff9
Te6edf3I2P_PROBES Tff7b72= T79c0ff5
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3configurationTb4b4b4, Te6edf3connected_socketTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)
Te6edf3c Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffget_config_objTb4b4b4(Te6edf3configurationTb4b4b4)
Te6edf3name Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3target_ip Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6fftarget_hostTa5d6ff" Tff7b72in Te6edf3c Tff7b72and Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72None Tff7b72else Tff7b72None
Te6edf3target_port Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6fftarget_portTa5d6ff" Tff7b72in Te6edf3c Tff7b72and Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72None Tff7b72else Tff7b72None
Te6edf3kiss_framing Tff7b72= Tff7b72False
Tff7b72if Ta5d6ff"Ta5d6ffkiss_framingTa5d6ff" Tff7b72in Te6edf3c Tff7b72and Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffkiss_framingTa5d6ff"Tb4b4b4) Tff7b72== Tff7b72TrueTb4b4b4:
Te6edf3kiss_framing Tff7b72= Tff7b72True
Te6edf3i2p_tunneled Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffi2p_tunneledTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffi2p_tunneledTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72False
Te6edf3connect_timeout Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffconnect_timeoutTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffconnect_timeoutTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3max_reconnect_tries Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffmax_reconnect_triesTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffmax_reconnect_triesTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3fixed_mtu Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6fffixed_mtuTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6fffixed_mtuTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Tff7b72if Te6edf3fixed_mtuTb4b4b4:
Tff7b72if Te6edf3fixed_mtu Tff7b72< Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTUTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffConfigured MTU of Tffd700{Te6edf3fixed_mtuTffd700}Ta5d6ff bytes is too smallTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffAUTOCONFIGURE_MTU Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffFIXED_MTU Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= Te6edf3TCPInterfaceTff7b72.Td2a8ffHW_MTU Tff7b72if Tff7b72not Te6edf3fixed_mtu Tff7b72else Te6edf3fixed_mtu
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3name
Tff7b72selfTff7b72.Td2a8ffinitiator Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffreconnecting Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffnever_connected Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffdetached Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffkiss_framing Tff7b72= Te6edf3kiss_framing
Tff7b72selfTff7b72.Td2a8ffi2p_tunneled Tff7b72= Te6edf3i2p_tunneled
Tff7b72selfTff7b72.Td2a8ffmode Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_FULL
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3TCPClientInterfaceTff7b72.Td2a8ffBITRATE_GUESS
Tff7b72selfTff7b72.Td2a8ffsupports_discovery Tff7b72= Tff7b72True
Tff7b72if Te6edf3max_reconnect_tries Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmax_reconnect_tries Tff7b72= Te6edf3TCPClientInterfaceTff7b72.Td2a8ffRECONNECT_MAX_TRIES
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmax_reconnect_tries Tff7b72= Te6edf3max_reconnect_tries
Tff7b72if Te6edf3connected_socket Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftarget_ip Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftarget_port Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Te6edf3connected_socket
Tff7b72if Te6edf3platformTff7b72.Td2a8ffsystemTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffLinuxTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffset_timeouts_linuxTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3platformTff7b72.Td2a8ffsystemTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffDarwinTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffset_timeouts_osxTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_NODELAYTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72elif Te6edf3target_ip Tff7b72!= Tff7b72None Tff7b72and Te6edf3target_port Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftarget_ip Tff7b72= Te6edf3target_ip
Tff7b72selfTff7b72.Td2a8fftarget_port Tff7b72= Te6edf3target_port
Tff7b72selfTff7b72.Td2a8ffinitiator Tff7b72= Tff7b72True
Tff7b72if Te6edf3connect_timeout Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnect_timeout Tff7b72= Te6edf3connect_timeout
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnect_timeout Tff7b72= Te6edf3TCPClientInterfaceTff7b72.Td2a8ffINITIAL_CONNECT_TIMEOUT
Tff7b72if Te6edf3TCPClientInterfaceTff7b72.Td2a8ffSYNCHRONOUS_STARTTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffinitial_connectTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffinitial_connectTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffinitial_connectTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffconnectTb4b4b4(Te6edf3initialTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffread_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffkiss_framingTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwants_tunnel Tff7b72= Tff7b72True
Tff7b72def Td2a8ffset_timeouts_linuxTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffi2p_tunneledTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_USER_TIMEOUTTb4b4b4, Tffa657intTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffTCP_USER_TIMEOUT Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_KEEPALIVETb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_KEEPIDLETb4b4b4, Tffa657intTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffTCP_PROBE_AFTERTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_KEEPINTVLTb4b4b4, Tffa657intTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffTCP_PROBE_INTERVALTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_KEEPCNTTb4b4b4, Tffa657intTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffTCP_PROBESTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_USER_TIMEOUTTb4b4b4, Tffa657intTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffI2P_USER_TIMEOUT Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_KEEPALIVETb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_KEEPIDLETb4b4b4, Tffa657intTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffI2P_PROBE_AFTERTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_KEEPINTVLTb4b4b4, Tffa657intTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffI2P_PROBE_INTERVALTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_KEEPCNTTb4b4b4, Tffa657intTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffI2P_PROBESTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffset_timeouts_osxTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3socketTb4b4b4, Ta5d6ff"Ta5d6ffTCP_KEEPALIVETa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3TCP_KEEPIDLE Tff7b72= Te6edf3socketTff7b72.Td2a8ffTCP_KEEPALIVE
Tff7b72elseTb4b4b4:
Te6edf3TCP_KEEPIDLE Tff7b72= T79c0ff0x10
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_KEEPALIVETb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffi2p_tunneledTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3TCP_KEEPIDLETb4b4b4, Tffa657intTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffTCP_PROBE_AFTERTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3TCP_KEEPIDLETb4b4b4, Tffa657intTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffI2P_PROBE_AFTERTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffdetachTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsocketTb4b4b4, Ta5d6ff"Ta5d6ffcloseTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffcloseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdetached Tff7b72= Tff7b72True
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffshutdownTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSHUT_RDWRTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while shutting down socket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while closing socket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Tff7b72None
Tff7b72def Td2a8ffconnectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3initialTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3initialTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEstablishing TCP connection for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3address_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Tff7b72selfTff7b72.Td2a8fftarget_ipTb4b4b4, Tff7b72selfTff7b72.Td2a8fftarget_portTb4b4b4, Te6edf3protoTff7b72=Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3address_family Tff7b72= Te6edf3address_infoTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3target_address Tff7b72= Te6edf3address_infoTb4b4b4[T79c0ff4Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3address_familyTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_STREAMTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsettimeoutTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffINITIAL_CONNECT_TIMEOUTTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_NODELAYTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffconnectTb4b4b4(Te6edf3target_addressTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsettimeoutTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Tff7b72if Te6edf3initialTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTCP connection for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff establishedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Te6edf3initialTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInitial connection for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff could not be established: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLeaving unconnected and retrying connection in Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffRECONNECT_WAITTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff seconds.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72raise Te6edf3e
Tff7b72if Te6edf3platformTff7b72.Td2a8ffsystemTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffLinuxTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffset_timeouts_linuxTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3platformTff7b72.Td2a8ffsystemTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffDarwinTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffset_timeouts_osxTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffnever_connected Tff7b72= Tff7b72False
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffreconnectTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffinitiatorTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffreconnectingTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreconnecting Tff7b72= Tff7b72True
Te6edf3attempts Tff7b72= T79c0ff0
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3TCPClientInterfaceTff7b72.Td2a8ffRECONNECT_WAITTb4b4b4)
Te6edf3attempts Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmax_reconnect_tries Tff7b72!= Tff7b72None Tff7b72and Te6edf3attempts Tff7b72> Tff7b72selfTff7b72.Td2a8ffmax_reconnect_triesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMax reconnection attempts reached for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72break
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffConnection attempt for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff failed: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffnever_connectedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReconnected socket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreconnecting Tff7b72= Tff7b72False
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffread_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffkiss_framingTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffsynthesize_tunnelTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to reconnect on a non-initiator TCP interface. This should not happen.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72raise Tf85149IOErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to reconnect on a non-initiator TCP interfaceTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffprocess_incomingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffonline Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffinboundTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTb4b4b4)
Tff7b72def Td2a8ffprocess_outgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffonline Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
T8b949e# while self.writing:
T8b949e# time.sleep(0.01)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72True
Tff7b72if Tff7b72selfTff7b72.Td2a8ffkiss_framingTb4b4b4:
Te6edf3data Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3KISSTff7b72.Td2a8ffFENDTb4b4b4]Tb4b4b4)Tff7b72+Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3KISSTff7b72.Td2a8ffCMD_DATATb4b4b4]Tb4b4b4)Tff7b72+Te6edf3KISSTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3dataTb4b4b4)Tff7b72+Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3KISSTff7b72.Td2a8ffFENDTb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3data Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tff7b72+Te6edf3HDLCTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3dataTb4b4b4)Tff7b72+Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsendallTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffException occurred while transmitting via Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, tearing down interfaceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffcheck_frame_lenTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3frame_lenTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3frame_len Tff7b72<Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffHEADER_MINSIZETb4b4b4: Tff7b72return Tff7b72False
Tff7b72elif Te6edf3frame_len Tff7b72> Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72+ Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffifac_size Tff7b72or T79c0ff0Tb4b4b4)Tb4b4b4: Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72True
Tff7b72def Td2a8ffinvalid_frameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3frame_lenTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid HDLC frame of Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3frame_lenTb4b4b4)Tffd700}Ta5d6ff received on Tffd700{Tff7b72selfTffd700}Ta5d6ff, dropping frameTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72def Td2a8ffread_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3in_frame Tff7b72= Tff7b72False
Te6edf3escape Tff7b72= Tff7b72False
Te6edf3frame_buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3data_in Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3data_buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72while Tff7b72TrueTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocketTb4b4b4: Te6edf3data_in Tff7b72= Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffrecvTb4b4b4(T79c0ff4096Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3data_in Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72if Tffa657lenTb4b4b4(Te6edf3data_inTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffkiss_framingTb4b4b4:
T8b949e# Read loop for KISS framing
Te6edf3pointer Tff7b72= T79c0ff0
Tff7b72while Te6edf3pointer Tff7b72< Tffa657lenTb4b4b4(Te6edf3data_inTb4b4b4)Tb4b4b4:
Te6edf3byte Tff7b72= Te6edf3data_inTb4b4b4[Te6edf3pointerTb4b4b4]
Te6edf3pointer Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tb4b4b4(Te6edf3in_frame Tff7b72and Te6edf3byte Tff7b72== Te6edf3KISSTff7b72.Td2a8ffFEND Tff7b72and Te6edf3command Tff7b72== Te6edf3KISSTff7b72.Td2a8ffCMD_DATATb4b4b4)Tb4b4b4:
Te6edf3in_frame Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4(Te6edf3data_bufferTb4b4b4)
Tff7b72elif Tb4b4b4(Te6edf3byte Tff7b72== Te6edf3KISSTff7b72.Td2a8ffFENDTb4b4b4)Tb4b4b4:
Te6edf3in_frame Tff7b72= Tff7b72True
Te6edf3command Tff7b72= Te6edf3KISSTff7b72.Td2a8ffCMD_UNKNOWN
Te6edf3data_buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72elif Tb4b4b4(Te6edf3in_frame Tff7b72and Tffa657lenTb4b4b4(Te6edf3data_bufferTb4b4b4) Tff7b72< Tff7b72selfTff7b72.Td2a8ffHW_MTUTb4b4b4)Tb4b4b4:
Tff7b72if Tb4b4b4(Tffa657lenTb4b4b4(Te6edf3data_bufferTb4b4b4) Tff7b72== T79c0ff0 Tff7b72and Te6edf3command Tff7b72== Te6edf3KISSTff7b72.Td2a8ffCMD_UNKNOWNTb4b4b4)Tb4b4b4:
T8b949e# We only support one HDLC port for now, so
T8b949e# strip off the port nibble
Te6edf3byte Tff7b72= Te6edf3byte Tff7b72& T79c0ff0x0F
Te6edf3command Tff7b72= Te6edf3byte
Tff7b72elif Tb4b4b4(Te6edf3command Tff7b72== Te6edf3KISSTff7b72.Td2a8ffCMD_DATATb4b4b4)Tb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3byte Tff7b72== Te6edf3KISSTff7b72.Td2a8ffFESCTb4b4b4)Tb4b4b4:
Te6edf3escape Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3escapeTb4b4b4)Tb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3byte Tff7b72== Te6edf3KISSTff7b72.Td2a8ffTFENDTb4b4b4)Tb4b4b4:
Te6edf3byte Tff7b72= Te6edf3KISSTff7b72.Td2a8ffFEND
Tff7b72if Tb4b4b4(Te6edf3byte Tff7b72== Te6edf3KISSTff7b72.Td2a8ffTFESCTb4b4b4)Tb4b4b4:
Te6edf3byte Tff7b72= Te6edf3KISSTff7b72.Td2a8ffFESC
Te6edf3escape Tff7b72= Tff7b72False
Te6edf3data_buffer Tff7b72= Te6edf3data_bufferTff7b72+Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3byteTb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# Read loop for standard HDLC framing
Te6edf3frame_buffer Tff7b72+Tff7b72= Te6edf3data_in
Te6edf3flags_remaining Tff7b72= Tff7b72True
Tff7b72while Te6edf3flags_remainingTb4b4b4:
Te6edf3frame_start Tff7b72= Te6edf3frame_bufferTff7b72.Td2a8fffindTb4b4b4(Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4)
Tff7b72if Te6edf3frame_start Tff7b72!= Tff7b72-T79c0ff1Tb4b4b4:
Te6edf3frame_end Tff7b72= Te6edf3frame_bufferTff7b72.Td2a8fffindTb4b4b4(Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4, Te6edf3frame_startTff7b72+T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3frame_end Tff7b72!= Tff7b72-T79c0ff1Tb4b4b4:
Te6edf3frame Tff7b72= Te6edf3frame_bufferTb4b4b4[Te6edf3frame_startTff7b72+T79c0ff1Tb4b4b4:Te6edf3frame_endTb4b4b4]
Te6edf3frame Tff7b72= Te6edf3frameTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffFLAG Tff7b72^ Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3frame Tff7b72= Te6edf3frameTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffESC Tff7b72^ Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3frame_len Tff7b72= Tffa657lenTb4b4b4(Te6edf3frameTb4b4b4)
Tff7b72if Te6edf3frame_len Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcheck_frame_lenTb4b4b4(Te6edf3frame_lenTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4(Te6edf3frameTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffinvalid_frameTb4b4b4(Tffa657lenTb4b4b4(Te6edf3frameTb4b4b4)Tb4b4b4)
Te6edf3frame_buffer Tff7b72= Te6edf3frame_bufferTb4b4b4[Te6edf3frame_endTb4b4b4:Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3frame_bufferTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffHW_MTUTff7b72*T79c0ff2Tb4b4b4: Te6edf3frame_buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3flags_remaining Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Te6edf3frame_buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3flags_remaining Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffinitiator Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe socket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was closed, attempting to reconnect...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe socket for remote client Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was closed.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72break
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn interface error occurred for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffinitiatorTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAttempting to reconnect...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffteardownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffinitiator Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff experienced an unrecoverable error and is being torn down. Restart Reticulum to attempt to open this interface again.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffpanic_on_interface_errorTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is being torn down.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72False
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72while Tff7b72self Tff7b72in Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffspawned_interfacesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffspawned_interfacesTff7b72.Td2a8ffremoveTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffinitiatorTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffremove_interfaceTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ff:Ta5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8fftarget_ipTb4b4b4:
Te6edf3ip_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[Tffd700{Tff7b72selfTff7b72.Td2a8fftarget_ipTffd700}Ta5d6ff]Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ip_str Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8fftarget_ipTffd700}Ta5d6ff"
Tff7b72return Ta5d6ff"Ta5d6ffTCPInterface[Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3ip_strTff7b72+Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8fftarget_portTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff]Ta5d6ff"
Tff7b72class T56d364TCPServerInterfaceTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:
Te6edf3BITRATE_GUESS Tff7b72= T79c0ff10_000_000
Te6edf3DEFAULT_IFAC_SIZE Tff7b72= T79c0ff16
Te6edf3AUTOCONFIGURE_MTU Tff7b72= Tff7b72True
Tf0883e@staticmethod
Tff7b72def Td2a8ffget_address_for_ifTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3bind_portTb4b4b4, Te6edf3prefer_ipv6Tff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787RNST7ee787.T7ee787Interfaces Tff7b72import Te6edf3netinfo
Te6edf3ifaddr Tff7b72= Te6edf3netinfoTff7b72.Td2a8ffifaddressesTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3ifaddrTb4b4b4) Tff7b72< T79c0ff1Tb4b4b4:
Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo addresses available on specified kernel interface Tffea00\"Tffd700{Te6edf3nameTffd700}Tffea00\"Ta5d6ff for TCPServerInterface to bind toTa5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3prefer_ipv6 Tff7b72or Tff7b72not Te6edf3netinfoTff7b72.Td2a8ffAF_INET Tff7b72in Te6edf3ifaddrTb4b4b4) Tff7b72and Te6edf3netinfoTff7b72.Td2a8ffAF_INET6 Tff7b72in Te6edf3ifaddrTb4b4b4:
Te6edf3bind_ip Tff7b72= Te6edf3ifaddrTb4b4b4[Te6edf3netinfoTff7b72.Td2a8ffAF_INET6Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffaddrTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3bind_ipTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6fffe80::Ta5d6ff"Tb4b4b4)Tb4b4b4:
T8b949e# We'll need to add the interface as scope for link-local addresses
Tff7b72return Te6edf3TCPServerInterfaceTff7b72.Td2a8ffget_address_for_hostTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3bind_ipTffd700}Ta5d6ff%Tffd700{Te6edf3nameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3bind_portTb4b4b4, Te6edf3prefer_ipv6Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3TCPServerInterfaceTff7b72.Td2a8ffget_address_for_hostTb4b4b4(Te6edf3bind_ipTb4b4b4, Te6edf3bind_portTb4b4b4, Te6edf3prefer_ipv6Tb4b4b4)
Tff7b72elif Te6edf3netinfoTff7b72.Td2a8ffAF_INET Tff7b72in Te6edf3ifaddrTb4b4b4:
Te6edf3bind_ip Tff7b72= Te6edf3ifaddrTb4b4b4[Te6edf3netinfoTff7b72.Td2a8ffAF_INETTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffaddrTa5d6ff"Tb4b4b4]
Tff7b72return Tb4b4b4(Te6edf3bind_ipTb4b4b4, Te6edf3bind_portTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo addresses available on specified kernel interface Tffea00\"Tffd700{Te6edf3nameTffd700}Tffea00\"Ta5d6ff for TCPServerInterface to bind toTa5d6ff"Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffget_address_for_hostTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3bind_portTb4b4b4, Te6edf3prefer_ipv6Tff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3address_infos Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3bind_portTb4b4b4, Te6edf3protoTff7b72=Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4)
Te6edf3address_info Tff7b72= Te6edf3address_infosTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72for Te6edf3entry Tff7b72in Te6edf3address_infosTb4b4b4:
Tff7b72if Te6edf3prefer_ipv6 Tff7b72and Te6edf3entryTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4:
Te6edf3address_info Tff7b72= Te6edf3entryTb4b4b4; Tff7b72break
Tff7b72elif Tff7b72not Te6edf3prefer_ipv6 Tff7b72and Te6edf3entryTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4:
Te6edf3address_info Tff7b72= Te6edf3entryTb4b4b4; Tff7b72break
Tff7b72if Te6edf3address_infoTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4:
Tff7b72return Tb4b4b4(Te6edf3nameTb4b4b4, Te6edf3bind_portTb4b4b4, Te6edf3address_infoTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3address_infoTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4)
Tff7b72elif Te6edf3address_infoTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4:
Tff7b72return Tb4b4b4(Te6edf3nameTb4b4b4, Te6edf3bind_portTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo suitable kernel interface available for address Tffea00\"Tffd700{Te6edf3nameTffd700}Tffea00\"Ta5d6ff for TCPServerInterface to bind toTa5d6ff"Tb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffclientsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4)
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3configurationTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)
Te6edf3c Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffget_config_objTb4b4b4(Te6edf3configurationTb4b4b4)
Te6edf3name Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3device Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffdeviceTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffdeviceTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3port Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffportTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3bindip Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6fflisten_ipTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3bindport Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6fflisten_portTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3i2p_tunneled Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffi2p_tunneledTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffi2p_tunneledTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72False
Te6edf3prefer_ipv6 Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffprefer_ipv6Ta5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffprefer_ipv6Ta5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72False
Tff7b72if Te6edf3port Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3bindport Tff7b72= Te6edf3port
Tff7b72selfTff7b72.Td2a8ffsupports_discovery Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= Te6edf3TCPInterfaceTff7b72.Td2a8ffHW_MTU
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffspawned_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3name
Tff7b72selfTff7b72.Td2a8ffdetached Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffi2p_tunneled Tff7b72= Te6edf3i2p_tunneled
Tff7b72selfTff7b72.Td2a8ffmode Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_FULL
Tff7b72if Te6edf3bindport Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo TCP port configured for interface Tffea00\"Tffd700{Te6edf3nameTffd700}Tffea00\"Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbind_port Tff7b72= Te6edf3bindport
Te6edf3bind_address Tff7b72= Tff7b72None
Tff7b72if Te6edf3device Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3bind_address Tff7b72= Te6edf3TCPServerInterfaceTff7b72.Td2a8ffget_address_for_ifTb4b4b4(Te6edf3deviceTb4b4b4, Tff7b72selfTff7b72.Td2a8ffbind_portTb4b4b4, Te6edf3prefer_ipv6Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3bindip Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo TCP bind IP configured for interface Tffea00\"Tffd700{Te6edf3nameTffd700}Tffea00\"Ta5d6ff"Tb4b4b4)
Te6edf3bind_address Tff7b72= Te6edf3TCPServerInterfaceTff7b72.Td2a8ffget_address_for_hostTb4b4b4(Te6edf3bindipTb4b4b4, Tff7b72selfTff7b72.Td2a8ffbind_portTb4b4b4, Te6edf3prefer_ipv6Tb4b4b4)
Tff7b72if Te6edf3bind_address Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffbind_ip Tff7b72= Te6edf3bind_addressTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72def Td2a8ffhandlerFactoryTb4b4b4(Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffcreateHandlerTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3TCPInterfaceHandlerTb4b4b4(Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)
Tff7b72return Te6edf3createHandler
Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72if Tffa657lenTb4b4b4(Te6edf3bind_addressTb4b4b4) Tff7b72== T79c0ff4Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3ThreadingTCP6ServerTff7b72.Td2a8ffallow_reuse_address Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffserver Tff7b72= Te6edf3ThreadingTCP6ServerTb4b4b4(Te6edf3bind_addressTb4b4b4, Te6edf3handlerFactoryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffincoming_connectionTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while binding IPv6 socket for interface, the contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6ff"Ta5d6ffCould not bind IPv6 socket for interface. Please check the specified Tffea00\"Ta5d6fflisten_ipTffea00\"Ta5d6ff configuration optionTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3ThreadingTCPServerTff7b72.Td2a8ffallow_reuse_address Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffserver Tff7b72= Te6edf3ThreadingTCPServerTb4b4b4(Te6edf3bind_addressTb4b4b4, Te6edf3handlerFactoryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffincoming_connectionTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffserverTff7b72.Td2a8ffdaemon_threads Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3TCPServerInterfaceTff7b72.Td2a8ffBITRATE_GUESS
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffserverTff7b72.Td2a8ffserve_foreverTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6ff"Ta5d6ffInsufficient parameters to create TCP listenerTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffincoming_connectionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAccepting incoming TCP connectionTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3spawned_configuration Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffClient on Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffi2p_tunneledTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffi2p_tunneledTb4b4b4}
Te6edf3spawned_interface Tff7b72= Te6edf3TCPClientInterfaceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffownerTb4b4b4, Te6edf3spawned_configurationTb4b4b4, Te6edf3connected_socketTff7b72=Te6edf3handlerTff7b72.Td2a8ffrequestTb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72selfTff7b72.Td2a8ffOUT
Te6edf3spawned_interfaceTff7b72.Td2a8ffIN Tff7b72= Tff7b72selfTff7b72.Td2a8ffIN
Te6edf3spawned_interfaceTff7b72.Td2a8ffingress_control Tff7b72= Tff7b72selfTff7b72.Td2a8ffingress_control
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_max_held_announces Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_max_held_announces
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_burst_hold Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_burst_hold
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_burst_freq Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_burst_freq
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_burst_freq_new Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_burst_freq_new
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_new_time Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_new_time
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_burst_penalty Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_burst_penalty
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_held_release_interval Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_held_release_interval
Te6edf3spawned_interfaceTff7b72.Td2a8ffegress_control Tff7b72= Tff7b72selfTff7b72.Td2a8ffegress_control
Te6edf3spawned_interfaceTff7b72.Td2a8ffec_pr_freq Tff7b72= Tff7b72selfTff7b72.Td2a8ffec_pr_freq
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_pr_burst_freq_new Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_pr_burst_freq_new
Te6edf3spawned_interfaceTff7b72.Td2a8ffic_pr_burst_freq Tff7b72= Tff7b72selfTff7b72.Td2a8ffic_pr_burst_freq
Te6edf3spawned_interfaceTff7b72.Td2a8fftarget_ip Tff7b72= Te6edf3handlerTff7b72.Td2a8ffclient_addressTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3spawned_interfaceTff7b72.Td2a8fftarget_port Tff7b72= Tffa657strTb4b4b4(Te6edf3handlerTff7b72.Td2a8ffclient_addressTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffparent_interface Tff7b72= Tff7b72self
Te6edf3spawned_interfaceTff7b72.Td2a8ffbitrate Tff7b72= Tff7b72selfTff7b72.Td2a8ffbitrate
Te6edf3spawned_interfaceTff7b72.Td2a8ffoptimise_mtuTb4b4b4(Tb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_size Tff7b72= Tff7b72selfTff7b72.Td2a8ffifac_size
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netname Tff7b72= Tff7b72selfTff7b72.Td2a8ffifac_netname
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netkey Tff7b72= Tff7b72selfTff7b72.Td2a8ffifac_netkey
Tff7b72if Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netname Tff7b72!= Tff7b72None Tff7b72or Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netkey Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72if Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netname Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netnameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netkey Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_netkeyTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3ifac_origin_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3ifac_originTb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_key Tff7b72= Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffhkdfTb4b4b4(
Te6edf3lengthTff7b72=T79c0ff64Tb4b4b4,
Te6edf3derive_fromTff7b72=Te6edf3ifac_origin_hashTb4b4b4,
Te6edf3saltTff7b72=Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffIFAC_SALTTb4b4b4,
Te6edf3contextTff7b72=Tff7b72None
Tb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_keyTb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_signature Tff7b72= Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_identityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3spawned_interfaceTff7b72.Td2a8ffifac_keyTb4b4b4)Tb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffannounce_rate_target Tff7b72= Tff7b72selfTff7b72.Td2a8ffannounce_rate_target
Te6edf3spawned_interfaceTff7b72.Td2a8ffannounce_rate_grace Tff7b72= Tff7b72selfTff7b72.Td2a8ffannounce_rate_grace
Te6edf3spawned_interfaceTff7b72.Td2a8ffannounce_rate_penalty Tff7b72= Tff7b72selfTff7b72.Td2a8ffannounce_rate_penalty
Te6edf3spawned_interfaceTff7b72.Td2a8ffmode Tff7b72= Tff7b72selfTff7b72.Td2a8ffmode
Te6edf3spawned_interfaceTff7b72.Td2a8ffHW_MTU Tff7b72= Tff7b72selfTff7b72.Td2a8ffHW_MTU
Te6edf3spawned_interfaceTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSpawned new TCPClient Interface: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3spawned_interfaceTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffadd_interfaceTb4b4b4(Te6edf3spawned_interfaceTb4b4b4)
Tff7b72while Te6edf3spawned_interface Tff7b72in Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3spawned_interfaceTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffspawned_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3spawned_interfaceTb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffread_loopTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffreceived_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3from_spawnedTb4b4b4: Tff7b72selfTff7b72.Td2a8ffia_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffsent_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3from_spawnedTb4b4b4: Tff7b72selfTff7b72.Td2a8ffoa_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffreceived_path_requestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3from_spawnedTb4b4b4: Tff7b72selfTff7b72.Td2a8ffip_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffsent_path_requestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3from_spawnedTb4b4b4: Tff7b72selfTff7b72.Td2a8ffop_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffprocess_outgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ffdetachTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdetached Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffserver Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffserverTb4b4b4, Ta5d6ff"Ta5d6ffshutdownTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffserverTff7b72.Td2a8ffshutdownTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDetaching Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffserverTff7b72.Td2a8ffshutdownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffserverTff7b72.Td2a8ffserver_closeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffserver Tff7b72= Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while shutting down server for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ff:Ta5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffbind_ipTb4b4b4:
Te6edf3ip_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[Tffd700{Tff7b72selfTff7b72.Td2a8ffbind_ipTffd700}Ta5d6ff]Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ip_str Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffbind_ipTffd700}Ta5d6ff"
Tff7b72return Ta5d6ff"Ta5d6ffTCPServerInterface[Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffnameTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3ip_strTff7b72+Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbind_portTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff]Ta5d6ff"
Tff7b72class T56d364TCPInterfaceHandlerTb4b4b4(Te6edf3socketserverTff7b72.Td2a8ffBaseRequestHandlerTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Te6edf3socketserverTff7b72.Td2a8ffBaseRequestHandlerTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)
Tff7b72def Td2a8ffhandleTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Te6edf3handlerTff7b72=Tff7b72selfTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────